home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-ppc-src / ar / ar.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  6KB  |  263 lines

  1. /* $VER: ar ar.c V0.1 (31.01.98)
  2.  *
  3.  * This file is part of ar, a portable archive maintanance
  4.  * utility for normal and BSD-style archives.
  5.  * Copyright (c) 1999  Frank Wille
  6.  *
  7.  * ar is freeware and part of the portable and retargetable ANSI C
  8.  * compiler vbcc, copyright (c) 1995-99 by Volker Barthelmann.
  9.  * ar may be freely redistributed as long as no modifications are
  10.  * made and nothing is charged for it. Non-commercial usage is allowed
  11.  * without any restrictions.
  12.  * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
  13.  * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
  14.  *
  15.  *
  16.  * v0.1  (31.01.99) phx
  17.  *       First working version, which only supports 'q' (quick append)
  18.  *       and 't' (table of contents), reads and writes normals and
  19.  *       BSD-style archives. Symbol table will not be created!
  20.  * v0.0  (29.01.99) phx
  21.  *       File created.
  22.  */
  23.  
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include "ar.h"
  28. #include "errors.h"
  29.  
  30.  
  31. extern void show_usage(void);
  32. extern void ar_delete(struct Args *);
  33. extern void ar_move(struct Args *);
  34. extern void ar_print(struct Args *);
  35. extern void ar_qappend(struct Args *);
  36. extern void ar_replace(struct Args *);
  37. extern void ar_contents(struct Args *);
  38. extern void ar_extract(struct Args *);
  39.  
  40. /* local */
  41. static uint32 getmodifiers(char,char *,uint32);
  42. static uint32 chkmodifier(uint32,uint32,char,char);
  43. static void argerror(void);
  44.  
  45.  
  46.  
  47. #ifdef AMIGA
  48. extern char **expand_args(int *,int,char *[],int);
  49.  
  50.  
  51. int main(int _argc,char *_argv[])
  52. {
  53.   int argc;
  54.   char **argv = expand_args(&argc,_argc,_argv,2);
  55.  
  56. #else
  57. int main(int argc,char *argv[])
  58. {
  59. #endif
  60.   struct Args a;
  61.   char *p,c;
  62.  
  63.   /* init */
  64.   memset(&a,0,sizeof(struct Args));
  65.  
  66.   /* parse arguments */
  67.   if (argc < 3) {
  68.     if (argc == 2)
  69.       error(EMISSARCHNAME);
  70.     argerror();
  71.   }
  72.   p = argv[1];
  73.   if (*p == '-')
  74.     p++;
  75.  
  76.   /* get key argument */
  77.   switch (c = *p++) {
  78.     case 'd':                   /* delete */
  79.       if (argc < 4)
  80.         error(EMISSFILENAME);
  81.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_BSD|AR_VERBOSE);
  82.       a.arname = argv[2];
  83.       a.files = &argv[3];
  84.       a.filecnt = argc - 3;
  85.       ar_delete(&a);
  86.       break;
  87.  
  88.     case 'm':                   /* move */
  89.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_BSD|AR_VERBOSE|AR_POS);
  90.       if (a.modifier & AR_POS) {
  91.         if (argc < 4)
  92.           error(EMISSARCHNAME);
  93.         if (argc < 5)
  94.           error(EMISSFILENAME);
  95.         a.position = argv[2];
  96.         a.arname = argv[3];
  97.         a.files = &argv[4];
  98.         a.filecnt = argc - 4;
  99.       }
  100.       else {
  101.         if (argc < 4)
  102.           error(EMISSFILENAME);
  103.         a.arname = argv[2];
  104.         a.files = &argv[3];
  105.         a.filecnt = argc - 3;
  106.       }
  107.       ar_move(&a);
  108.       break;
  109.  
  110.     case 'p':                   /* print */
  111.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_VERBOSE);
  112.       a.arname = argv[2];
  113.       if (argc >= 4) {
  114.         a.files = &argv[3];
  115.         a.filecnt = argc - 3;
  116.       }
  117.       ar_print(&a);
  118.       break;
  119.  
  120.     case 'q':                   /* quick append */
  121.       if (argc < 4)
  122.         error(EMISSFILENAME);
  123.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_BSD|AR_VERBOSE|AR_CREATIGN);
  124.       a.arname = argv[2];
  125.       a.files = &argv[3];
  126.       a.filecnt = argc - 3;
  127.       ar_qappend(&a);
  128.       break;
  129.  
  130.     case 'r':                   /* replace */
  131.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_BSD|AR_VERBOSE|
  132.                                   AR_POS|AR_CREATIGN|AR_UPDATE);
  133.       if (a.modifier & AR_POS) {
  134.         if (argc < 4)
  135.           error(EMISSARCHNAME);
  136.         if (argc < 5)
  137.           error(EMISSFILENAME);
  138.         a.position = argv[2];
  139.         a.arname = argv[3];
  140.         a.files = &argv[4];
  141.         a.filecnt = argc - 4;
  142.       }
  143.       else {
  144.         if (argc < 4)
  145.           error(EMISSFILENAME);
  146.         a.arname = argv[2];
  147.         a.files = &argv[3];
  148.         a.filecnt = argc - 3;
  149.       }
  150.       ar_replace(&a);
  151.       break;
  152.  
  153.     case 't':                   /* table of contents */
  154.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_VERBOSE);
  155.       a.arname = argv[2];
  156.       if (argc >= 4) {
  157.         a.files = &argv[3];
  158.         a.filecnt = argc - 3;
  159.       }
  160.       ar_contents(&a);
  161.       break;
  162.  
  163.     case 'x':                   /* extract */
  164.       a.modifier = getmodifiers(c,p,AR_TRUNC|AR_VERBOSE|AR_PRESERVE|
  165.                                   AR_UPDATE);
  166.       a.arname = argv[2];
  167.       if (argc >= 4) {
  168.         a.files = &argv[3];
  169.         a.filecnt = argc - 3;
  170.       }
  171.       ar_extract(&a);
  172.       break;
  173.  
  174.     default:
  175.       error(EUNKNOWNKEY,c);
  176.       break;
  177.   }
  178.  
  179.   return (0);
  180. }
  181.  
  182.  
  183. void cleanup()
  184. {
  185. }
  186.  
  187.  
  188. static uint32 getmodifiers(char key,char *s,uint32 allowed)
  189. {
  190.   char c;
  191.   uint32 m = 0;
  192.  
  193.   for (;;) {
  194.     switch (c = *s++) {
  195.       case '\0':
  196.         break;
  197.       case 'a':
  198.         m |= chkmodifier(AR_AFTER,allowed,c,key);
  199.         continue;
  200.       case 'b':
  201.         m |= chkmodifier(AR_BEFORE,allowed,c,key);
  202.         continue;
  203.       case 'i':
  204.         m |= chkmodifier(AR_BEFORE,allowed,c,key);
  205.         continue;
  206.       case 'c':
  207.         m |= chkmodifier(AR_CREATIGN,allowed,c,key);
  208.         continue;
  209.       case 'o':
  210.         m |= chkmodifier(AR_PRESERVE,allowed,c,key);
  211.         continue;
  212.       case 'u':
  213.         m |= chkmodifier(AR_UPDATE,allowed,c,key);
  214.         continue;
  215.       case 'v':
  216.         m |= chkmodifier(AR_VERBOSE,allowed,c,key);
  217.         continue;
  218.       case 'T':
  219.         m |= chkmodifier(AR_TRUNC,allowed,c,key);
  220.         continue;
  221.       case 'B':
  222.         m |= chkmodifier(AR_BSD,allowed,c,key);
  223.         continue;
  224.       default:
  225.         error(EMODNOTALLOWED,c,key);
  226.         continue;
  227.     }
  228.     break;
  229.   }
  230.   return (m);
  231. }
  232.  
  233.  
  234. static uint32 chkmodifier(uint32 mod,uint32 allowed,char c,char key)
  235. {
  236.   if (mod & allowed)
  237.     return (mod);
  238.   error(EMODNOTALLOWED,c,key);
  239.   return (0);
  240. }
  241.  
  242.  
  243. static void argerror(void)
  244. {
  245.   show_usage();
  246.   exit(1);
  247. }
  248.  
  249.  
  250. size_t filesize(FILE *fh,char *name)
  251. {
  252.   long oldpos,size;
  253.  
  254.   if ((oldpos = ftell(fh)) >= 0)
  255.     if (fseek(fh,0,SEEK_END) >= 0)
  256.       if ((size = ftell(fh)) >= 0)
  257.         if (fseek(fh,oldpos,SEEK_SET) >= 0)
  258.           return ((size_t)size);
  259.   fclose(fh);
  260.   error(EREADERR,name);  /* doesn't return */
  261.   return (0);
  262. }
  263.